package com.zy.core.data.jpa.support.entity.page;

import com.github.pagehelper.PageInfo;
import org.springframework.beans.BeanUtils;

import java.util.Arrays;
import java.util.List;

/**
 * 分页列表
 */
@SuppressWarnings("serial")
public class Pagination<T extends Object> extends SimplePage implements java.io.Serializable, Paginable {


	/**************************以下参数多用于mybatis******************************/
	/**
	 * 当前页的数量
	 */
	private int size;


	/**
	 * 由于startRow和endRow不常用，这里说个具体的用法
	 * 可以在页面中"显示startRow到endRow 共size条数据"
	 * 当前页面第一个元素在数据库中的行号
	 */
	private int startRow;

	/**
	 * 当前页面最后一个元素在数据库中的行号
	 */
	private int endRow;

	/**
	 * 总页数
	 */
	private int pages;

	//第一页
	private int firstPage;

	/**
	 * 是否为第一页
	 */
	private boolean isFirstPage;

	/**
	 * 是否为最后一页
	 */
	private boolean isLastPage;

	/**
	 * 是否有前一页
	 */
	private boolean hasPreviousPage;

	/**
	 * 是否有下一页
	 */
	private boolean hasNextPage;

	/**
	 * 导航页码数
	 */
	private int navigatePages;

	/**
	 * 所有导航页号
	 */
	private int[] navigatepageNums;

	/**
	 * 前一页
	 */
	private int prePage;

	/****************************以上参数多用于mybatis*******************************/


	/**
	 * 当前页的数据
	 */
	private List<T> list;

	public Pagination() {
	}

	/**
	 * 构造器
	 *
	 * @param pageNo     页码
	 * @param pageSize   每页几条数据
	 * @param totalCount 总共几条数据
	 */
	public Pagination(int pageNo, int pageSize, int totalCount) {
		super(pageNo, pageSize, totalCount);
	}

	/**
	 * 构造器
	 *
	 * @param pageNo     页码
	 * @param pageSize   每页几条数据
	 * @param totalCount 总共几条数据
	 * @param list       分页内容
	 */
	public Pagination(int pageNo, int pageSize, int totalCount, List<T> list) {
		super(pageNo, pageSize, totalCount);
		this.list = list;
	}

	/**
	 * 构造器
	 *
	 * @param pageInfo mybatis分页插件对象,将pageInfo中参数拷贝
	 */
	public Pagination(PageInfo<T> pageInfo){
		BeanUtils.copyProperties(pageInfo,this,"list");
	}

	/**
	 *
	 * @param pageInfo mybatis分页插件对象,将pageInfo中参数拷贝
	 * @param list 分页数据
	 */
	public Pagination(PageInfo<T> pageInfo,List<T> list){
		BeanUtils.copyProperties(pageInfo,this,"list");
		this.list = list;
	}

	/**
	 * 第一条数据位置
	 *
	 * @return
	 */
	public int getFirstResult() {
		return (pageNum - 1) * pageSize;
	}



	/**
	 * 获得分页内容
	 *
	 * @return
	 */
	public List<T> getList() {
		return list;
	}

	/**
	 * 设置分页内容
	 *
	 * @param list
	 */
	@SuppressWarnings("unchecked")
	public void setList(List<T> list) {
		this.list = list;
	}



	public int getSize() {
		return size;
	}

	public void setSize(int size) {
		this.size = size;
	}

	public int getStartRow() {
		return startRow;
	}

	public void setStartRow(int startRow) {
		this.startRow = startRow;
	}

	public int getEndRow() {
		return endRow;
	}

	public void setEndRow(int endRow) {
		this.endRow = endRow;
	}

	public int getPages() {
		return pages;
	}

	public void setPages(int pages) {
		this.pages = pages;
	}

	public int getFirstPage() {
		return firstPage;
	}

	public void setFirstPage(int firstPage) {
		this.firstPage = firstPage;
	}

	@Override
	public boolean isFirstPage() {
		return isFirstPage;
	}

	public void setFirstPage(boolean firstPage) {
		isFirstPage = firstPage;
	}

	@Override
	public boolean isLastPage() {
		return isLastPage;
	}

	public void setLastPage(boolean lastPage) {
		isLastPage = lastPage;
	}

	public boolean isHasPreviousPage() {
		return hasPreviousPage;
	}

	public void setHasPreviousPage(boolean hasPreviousPage) {
		this.hasPreviousPage = hasPreviousPage;
	}

	public boolean isHasNextPage() {
		return hasNextPage;
	}

	public void setHasNextPage(boolean hasNextPage) {
		this.hasNextPage = hasNextPage;
	}

	public int getNavigatePages() {
		return navigatePages;
	}

	public void setNavigatePages(int navigatePages) {
		this.navigatePages = navigatePages;
	}

	public int[] getNavigatepageNums() {
		return navigatepageNums;
	}

	public void setNavigatepageNums(int[] navigatepageNums) {
		this.navigatepageNums = navigatepageNums;
	}

	public int getPrePage() {
		return prePage;
	}

	public void setPrePage(int prePage) {
		this.prePage = prePage;
	}

	@Override
	public String toString() {
		return "Pagination{" +
				"size=" + size +
				", startRow=" + startRow +
				", endRow=" + endRow +
				", pages=" + pages +
				", firstPage=" + firstPage +
				", isFirstPage=" + isFirstPage +
				", isLastPage=" + isLastPage +
				", hasPreviousPage=" + hasPreviousPage +
				", hasNextPage=" + hasNextPage +
				", navigatePages=" + navigatePages +
				", navigatepageNums=" + Arrays.toString(navigatepageNums) +
				", prePage=" + prePage +
				", list=" + list +
				", total=" + total +
				", pageSize=" + pageSize +
				", pageNum=" + pageNum +
				'}';
	}
}